/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package documentadorrepositorio.fabricaArtefatos;

import documentadorrepositorio.descritoresArtefatos.DescritorArtefato;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Properties;

/**
 *
 * @author Vinicius
 */
public class FabricaDescritorArtefatos {

    private static FabricaDescritorArtefatos instance = null;
    private Properties configuracoesDescritorArtefatos = new Properties();

    private FabricaDescritorArtefatos() {
        carregarDescritorArtefatos();
    }

    public static FabricaDescritorArtefatos getInstance() {
        if (instance == null) {
            instance = new FabricaDescritorArtefatos();
        }
        return instance;
    }

    private void carregarDescritorArtefatos() {
        try {
            configuracoesDescritorArtefatos.load(FabricaDescritorArtefatos.class.getResourceAsStream("descritorArtefatos.properties"));
        } catch (IOException ex) {
        }
    }

    public ArrayList<DescritorArtefato> obtemDescritoresArtefatos() throws Exception {
        ArrayList<DescritorArtefato> descritores = new ArrayList<>();
        try {
            for (String prop : configuracoesDescritorArtefatos.stringPropertyNames()) {
                Method m = Class.forName(configuracoesDescritorArtefatos.getProperty(prop)).getDeclaredMethod("obtemInstacia");
                descritores.add((DescritorArtefato) m.invoke(null, null));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return descritores;
    }

    public DescritorArtefato create(String tipo) throws Exception {
        try {
            return (DescritorArtefato) Class.forName(configuracoesDescritorArtefatos.getProperty(tipo)).newInstance();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new Exception("Referencia não existente.");
        }
    }
}
